#include <stdio.h>

/*
 * 解法概述：利用二进制数，枚举n个数的所有可能的选择情况，判断每一种选择情况下的和是否为T。
 * 如果和为T，则将当前的选择方案输出。
 */

// 用函数是为了便于理解程序，完全可以将每个函数展开到调用的位置处

// 计算整数x的exp次方
long long_pow(long x, long exp) {
  long res = 1;
  long i = 0;
  for (i = 0; i < exp; i++)
    res = res * x;
  return res;
}

int main(void) {
  int n = 0;
  int arr[23] = {0};
  scanf("%d", &n);
  int i = 0;
  for (i = 0; i < n; i++)
    scanf("%d", &arr[i]);
  int T = 0;
  scanf("%d", &T);
  // 利用二进制枚举n个数的所有可能的选择方案
  long selected = 0;
  long solution_count = 0;
  for (selected = 1; selected < long_pow(2, n); selected++) {
    // 每个整数selected代表一种选择方案，
    // 最高比特位代表第n个数，最低比特位代表第1个数
    // printf("selected=%lx\n", selected);
    long sum = 0;
    // 通过操作tmp逐个比特处理
    long tmp = selected;
    int bit_pos = 0;
    while (tmp != 0) {
      // 当tmp中还有非0比特时
      int bit = tmp % 2; // 获取当前的二进制位
      if (bit > 0) {
        sum = sum + arr[bit_pos];
        // 如果当前bit被选择，那么就进行累加
      }
      // 处理更高的一个比特位
      tmp = tmp / 2; // 向前处理一个二进制位
      bit_pos++;     // 循环处理下一个比特
    }
    if (sum == T) {
      // 找到一组满足和为T的方案
      // printf("Find a solution!\n");
      tmp = selected;
      bit_pos = 0;
      while (tmp != 0) {
        int bit = tmp % 2;
        if (bit > 0)
          printf("%d ", arr[bit_pos]);
        tmp = tmp / 2;
        bit_pos++;
      }
      printf("\n");
      solution_count++;
    }
  }
  printf("%ld\n", solution_count);
  return 0;
}
